#include"../logs/viclog.h"
#include<vector>
#include<thread>
#include<chrono>
//封装一个接口，传入日志器名称、线程数量、日志数量、单挑日志大小
void bench(const std::string &logger_name,size_t thr_count,size_t msg_count,size_t msg_len)
{
    //1.获取日志器
    viclog::Logger::ptr logger = viclog::getLogger(logger_name);
    if(logger.get()==nullptr)
    {
        return ;
    }
    std::cout<<"测试日志："<<msg_count<<"条，总大小："<<(msg_count*msg_len)/1024<<"KB\n";
    //2.组织指定长度日志消息
    std::string msg(msg_len-1,'A');
    //3.创建指定数量的线程
    std::vector<std::thread> threads;
    std::vector<double> cost_arry(thr_count);
    size_t msg_per_thr=msg_count/thr_count;
    for(int i=0;i<thr_count;i++)
    {
        //vector::emplace_back--构造并插入
        threads.emplace_back([&,i](){
             //4.线程函数内部开始计时
             auto start=std::chrono::high_resolution_clock::now();
            //5.开始循环写日志
            for(int j=0;j<msg_per_thr;j++)
            {
                logger->fatal("%s",msg.c_str());
            }
            //6.线程函数内部结束计时
             auto end=std::chrono::high_resolution_clock::now();
             std::chrono::duration<double> cost=end-start;
             cost_arry[i]=cost.count();
             std::cout<<"线程 "<<i<<":"<<"\t输出日志数量:"<<msg_per_thr<<",耗时："<<cost.count()<<"s"<<std::endl;

        });
    }
    for(int i=0;i<thr_count;i++)
    {
        threads[i].join();
    }
    //7. 计算总耗时(d多线程下并发处理，耗时最多的线程就是总耗时)
    double max_cost=cost_arry[0];
    for(int i=0;i<thr_count;i++)
    {
        max_cost=max_cost<cost_arry[i]?cost_arry[i]:max_cost;
    }
    std::size_t msg_per_sec=msg_count/max_cost;
    std::size_t size_per_sec=msg_len*msg_count/max_cost/1024;
    //8.打印输出
    std::cout<<"总耗时："<<max_cost<<"s\n";
    std::cout<<"每秒输出日志数量："<<msg_per_sec<<"条\n";
    std::cout<<"每秒输出日志大小："<<size_per_sec<<"KB\n";

}
void sync_bench()
{
     std::unique_ptr<viclog::LoggerBuilder> builder(new viclog::GlobalLoggerBuilder());
    builder->buildLoggerName("sync_logger");
    builder->buildLoggerLevel(viclog::LogLevel::value::DEBUG);
    builder->buildFormatter("%m%n");
    builder->buildLoggerType(viclog::LoggerType::LOGGER_SYNC);
    //builder->buildEnableUnSafeAsync();
    builder->buildSink<viclog::FileSink>("./logfile/sync.log");
   
    builder->build();
    bench("sync_logger",1,1000000,100);
    //bench("sync_logger",3,10000,100);

}
void async_bench()
{
     std::unique_ptr<viclog::LoggerBuilder> builder(new viclog::GlobalLoggerBuilder());
    builder->buildLoggerName("async_logger");
    builder->buildLoggerLevel(viclog::LogLevel::value::DEBUG);
    builder->buildFormatter("%m%n");
    builder->buildLoggerType(viclog::LoggerType::LOGGER_ASYNC);
    builder->buildEnableUnSafeAsync();
    builder->buildSink<viclog::FileSink>("./logfile/async.log");
   

    builder->build();
    bench("async_logger",3,10000000,100);
    //bench("sync_logger",3,10000,100);

}
int main()
{
    async_bench();
}